package com.cskaoyan.javase.oop1._13block._2building;
/**
 * 构造代码块的使用场景
 * 根据构造代码块的特点，分析一下它的实际使用场景。
 * 构造代码块最大的特点就是其中的代码，最终会加入类的所有构造器中，所以依据这一点：
 * 我们可以"提取公因式"一样的，把所有构造器都需要执行的代码，放入构造代码块中。
 * 其次，构造代码块毕竟是给成员变量赋值用的，所以：
 *
 * 如果需要很复杂的代码完成成员变量的赋值（如果只是给一个值，用显式赋值和构造器足矣）
 * 比如需要一个算法，需要一定计算等等。在这些场景下，使用构造代码块赋值也是一个不错的选择。
 *
 * 实际上,完全可以把构造代码块理解成一个在创建对象过程,会自动被调用的成员方法.
 *
 * @since 11:01
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo4 {
    public static void main(String[] args) {
        for (int i = 0; i < 4; i++) {
            new Animal();
        }
        for (int i = 0; i < 5; i++) {
            new Animal(19);
        }
        for (int i = 0; i < 2; i++) {
            new Animal(18,"老虎");
        }
        System.out.println(Animal.count);
    }
}
class Animal{
    int age;
    String breed;


    // 统计外界创建对象的次数,需要使用一个静态成员变量计数器
    static int count;

    // 提取公因式,每个构造器都需要计数,直接放入构造代码块中
    {
        count++;
    }

    public Animal() {
    }

    public Animal(int age) {
        this.age = age;
    }

    public Animal(int age, String breed) {
        this.age = age;
        this.breed = breed;
    }

}
